随机数流

您所在的位置:网站首页 matlab 生成二进制随机数 随机数流

随机数流

2024-06-30 17:22| 来源: 网络整理| 查看: 265

RandStream

随机数流

全页展开说明

RandStream 使用指定的伪随机数生成器算法创建随机数流。

您可以从一个或多个随机数流生成 MATLAB® 中的伪随机数。生成随机数数组的最简单方法是使用 rand、randi、randn 或 randperm 函数。这些函数全部依赖于同一个均匀分布的随机数流,称为全局流。更改全局流可以使用 RandStream,但这不是必需的。如果使用 RandStream 创建一个流,可以使用 RandStream.setGlobalStream 使其成为全局流。但是,rng 函数提供了更简单的接口来创建一个可以满足大多数用例需求的全局流。

您也可以使用 RandStream 创建流,然后使用 rand、randi、randn 或 randperm 从这些流中生成随机数。生成的随机数独立于从全局流或其他流中得到的随机数。有关详细信息,请参阅对象函数。

创建对象

使用以下语法创建单个随机数流。如果要同时创建多个独立的流,请使用 RandStream.create 函数。

语法s = RandStream(gentype)s = RandStream(gentype,Name,Value)描述

示例

s = RandStream(gentype) 创建一个随机数流,该数流使用 gentype 指定的均匀伪随机数生成器算法。

示例

s = RandStream(gentype,Name,Value) 还使用一个或多个可选的 Name,Value 对组参量来控制流的属性。

输入参量

全部展开

gentype — 随机数生成器算法 'mt19937ar' | 'dsfmt19937' | 'mcg16807' | ...

随机数生成器算法,指定为字符向量或字符串标量(用于指定随机数生成器)。MATLAB 提供了几种生成器算法。下表概述了可用的生成器算法的名称和关键属性。一些生成器算法支持多个流和子流来创建相互独立的随机数集。有关详细信息,请参阅创建和控制随机数流。

名称生成器多流和子流支持全精度近似周期'mt19937ar'梅森旋转否219937-1'dsfmt19937'面向 SIMD 的快速梅森旋转算法 否219937-1'mlfg6331_64'乘法滞后斐波那契生成器是2124(251 个流,长度为 272)'mrg32k3a'组合多递归生成器是2191(263 个流,长度为 2127)'philox4x32_10'执行 10 轮的 Philox 4×32 生成器是2193(264 个流,长度为 2129)'threefry4x64_20'执行 20 轮的 Threefry 4×64 生成器是2514(2256 个流,长度为 2258)'shr3cong'移位寄存器生成器与线性同余生成器求和否264'swb2712'修正的借位减法生成器否21492'mcg16807'乘法同余生成器否231-2 名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: s = RandStream('mt19937ar','Seed',15,'NormalTransform','Polar')

Seed — 随机数种子 0 (默认) | 非负整数 | 'shuffle'

随机数种子,指定为由 'Seed' 和非负整数或 'shuffle' 组成的以逗号分隔的对组。种子指定算法生成随机数的起点。'shuffle' 根据当前时间创建种子。如果指定一个整数,它必须介于 0 到 232 − 1 之间。

如果在 MATLAB 启动时或在运行仿真之前创建流,请将生成器种子指定为初始化步骤。要重现一个流,请每次使用相同的种子。虽然使用多个种子会产生多个随机数序列,但无法保证不同序列在统计上是独立的。如果不同序列在统计上独立很重要,请指定 Substream 属性或使用 RandStream.create 来创建在统计上独立的流。

NormalTransform — 正态变换算法 'Ziggurat' | 'Polar' | 'Inversion'

使用 randn 从随机数流生成正态分布随机数的变换算法,指定为由 'NormalTransform' 和算法名称 'Ziggurat'、'Polar' 或 'Inversion' 之一组成的以逗号分隔的对组。有关详细信息,请参阅创建和控制随机数流。

属性

全部展开

随机数流 s 具有可控制其行为的属性。使用 p = s.Property 访问属性,并使用 s.Property = p 修改属性。要保存和还原流 s 的所有属性,您可以分别使用 A = get(s) 和 set(s,A)。此列表描述 RandStream 的属性。

Type — 随机数生成器算法 'mt19937ar' | 'dsfmt19937' | 'mcg16807' | ...

此 属性 为只读。

流使用的随机数生成器算法。有关生成器及其属性的汇总,请参阅生成器算法表。

并非所有生成器算法都支持多个流。对于某些生成器,您可以创建在统计上独立的多个流和子流。

数据类型: char

Seed — 随机数种子 0 (默认) | 非负整数

此 属性 为只读。

用于创建流的随机数种子,以非负整数形式返回。

数据类型: uint32

NumStreams — 流的数量 1 (默认) | 正整数

此 属性 为只读。

创建了当前流的组中的流数目,以正整数形式返回。

数据类型: uint64

StreamIndex — 流索引 1 (默认) | 正整数

此 属性 为只读。

用于创建当前流的流组中的当前流索引,以正整数形式返回。

数据类型: uint64

State — 当前内部状态 整数向量

生成器的当前内部状态,指定为整数向量。状态向量的大小取决于生成器算法。设置此属性时,赋给 s.State 的值必须是以前从 s.State 读取的值。使用 reset 将流恢复为其初始状态(如果以前从 State 属性读取了值)。通过 State 属性保存并还原生成器的内部状态可允许您重现随机数序列。

内部状态确定随机数流 s 产生的随机数序列。每次从单个流中生成随机数时,流中生成器的状态都会转换,以创建在统计上独立且在分布上相同的连续值。

注意

仅还原随机数流的状态或重置流,以从流中重现结果。

数据类型: uint32

Substream — 子流索引 1 (默认) | 正整数

流当前设置为的子流的索引。

对于某些生成器类型,您可以从一个随机流创建不同子流。从不同子流生成的值是相互独立的。有关支持子流的生成器,请参阅生成器算法表。

数据类型: double

NormalTransform — 正态变换算法 'Ziggurat' (默认) | 'Polar' | 'Inversion'

使用 randn 生成正态分布伪随机值的转换算法。

数据类型: char

Antithetic — 对偶值 false (默认) | true

s 是否生成对偶伪随机值,指定为逻辑值 true (1) 或 false (0)。对偶值是从 1 中减去默认生成的均匀分布伪随机值。

数据类型: logical

FullPrecision — 全精度生成 true (默认) | false

s 是否使用其全精度生成值,指定为逻辑值 true (1) 或 false (0)。如果 FullPrecision 为 false,则某些生成器可以更快地创建伪随机值,但这些值的随机位数更少。

数据类型: logical

对象函数

默认情况下,随机数生成函数(如 rand)使用全局随机数流。要指定不同流,请创建一个 RandStream 对象,并将其作为第一个输入参量进行传递。例如,使用面向 SIMD 的快速梅森旋转创建一个 4×1 随机数向量。

s = RandStream('dsfmt19937'); r = rand(s,4,1);

这些函数接受 RandStream 对象:

rand均匀分布的随机数

支持的语法,其中 s 是 RandStream 对象:

X = rand(s) X = rand(s,n) X = rand(s,sz1,...,szN) X = rand(s,sz) X = rand(s,__,typename) X = rand(s,__,'like',p)有关其他输入参量的详细信息,请参阅 rand、randi 和 randn。randi均匀分布的伪随机整数randn正态分布的随机数randperm整数的随机排列

支持的语法,其中 s 是 RandStream 对象:

p = randperm(s,n) p = randperm(s,n,k) 有关其他输入参量的详细信息,请参阅 randperm。

RandStream 的其他对象函数有:

RandStream.create创建在统计上独立的随机数流RandStream.list列出随机数生成器算法RandStream.getGlobalStream获取当前全局随机数流RandStream.setGlobalStream设置全局随机数流reset重置随机数流 示例

全部折叠

创建和使用流打开实时脚本

使用面向 SIMD 的快速梅森旋转创建一个随机数流。

s = RandStream('dsfmt19937')s = dsfmt19937 random stream Seed: 0 NormalTransform: Ziggurat

使用该流生成五个随机数。

rand(s,1,5)ans = 1×5 0.0306 0.2131 0.2990 0.3811 0.8635 初始化生成器种子打开实时脚本

基于当前时间使用生成器种子创建一个随机数流。通常不需要在每个 MATLAB® 会话中多次执行该操作,因为它可能会影响 MATLAB 生成的随机数的统计属性。

s = RandStream('mt19937ar','Seed','shuffle');

使用该流创建一个 3×3 随机值矩阵,其中的随机值在 0 和 1 之间均匀分布。

X1 = rand(s,3)X1 = 3×3 0.7825 0.3930 0.5002 0.2848 0.3707 0.4330 0.3626 0.5045 0.5414

从该流创建另外五个随机数。

X2 = rand(s,1,5)X2 = 1×5 0.7199 0.8375 0.2244 0.5365 0.3645 现有数组定义的大小和数据类型打开实时脚本

创建一个由单精度数组成的 2×3 矩阵。

p = single([0.1 -3 2.5; 1.2 -3.4 6]);

创建种子为零的一个随机数流。

s = RandStream('mcg16807','Seed',0);

使用该流生成一个与 p 具有相同大小和数据类型的由随机数组成的数组。

z = rand(s,size(p),'like',p)z = 2x3 single matrix 0.2190 0.6789 0.9347 0.0470 0.6793 0.3835 class(z)ans = 'single' 还原状态以重现输出打开实时脚本

创建种子为零的一个随机数流。

s = RandStream('mcg16807','Seed',0);

从该流生成五个随机数。每次您从该流生成一个数字时,生成器算法都会转换内部状态,以便下一个生成的数字与前一个数字独立同分布。

u1 = rand(s,1,5)u1 = 1×5 0.2190 0.0470 0.6789 0.6793 0.9347

保存生成器的当前状态。生成另外五个随机数。

savedState = s.State; u2 = rand(s,1,5)u2 = 1×5 0.3835 0.5194 0.8310 0.0346 0.0535

要重现五个随机数的最后结果,请将生成器状态还原到保存的状态。

s.State = savedState; u3 = rand(s,1,5)u3 = 1×5 0.3835 0.5194 0.8310 0.0346 0.0535

只读取和写入生成器状态以从该流重现特定的结果。

重置随机数流打开实时脚本

创建一个种子为 3 的随机数流。使用该流生成八个随机数。

stream = RandStream('dsfmt19937','Seed',3); z = rand(stream,1,8)z = 1×8 0.2550 0.8753 0.0908 0.1143 0.3617 0.8210 0.8444 0.6189

用等于 3 的种子将随机数流重置为其初始状态。重现生成的八个随机数。

reset(stream,3); z = rand(stream,1,8)z = 1×8 0.2550 0.8753 0.0908 0.1143 0.3617 0.8210 0.8444 0.6189

重置流的种子会使其与其他流间的独立性失效。仅在需要从该流中重现结果时重置流。

设置全局流和局部流打开实时脚本

创建两个随机数流。使用 RandStream.setGlobalStream 将第一个流设置为全局流。

globalStream = RandStream('mlfg6331_64','NormalTransform','Polar')globalStream = mlfg6331_64 random stream Seed: 0 NormalTransform: Polar RandStream.setGlobalStream(globalStream);

要显示当前全局流,请使用 RandStream.getGlobalStream。

RandStream.getGlobalStreamans = mlfg6331_64 random stream (current global stream) Seed: 0 NormalTransform: Polar

创建第二个流 myStream,它独立于您创建的新全局流。

myStream = RandStream('dsfmt19937','NormalTransform','Inversion')myStream = dsfmt19937 random stream Seed: 0 NormalTransform: Inversion

从全局流中生成三个随机数。从您创建的局部流 myStream 中生成另外三个随机数。

randn(1,3)ans = 1×3 0.8715 1.0588 -0.6956 randn(myStream,1,3)ans = 1×3 -1.8723 -0.7956 -0.5273

当您在不使用 myStream 的情况下调用函数 rand、randn 和 randi 时,它们从全局流中提取数据,不会影响使用 myStream 时调用这些函数的结果。

使用子流的随机数生成器打开实时脚本

对于某些生成器类型,您可以从一个随机流创建不同子流。从不同子流生成的值是相互独立的。

例如,使用组合的多重递归生成器创建一个随机数流。

s = RandStream('mrg32k3a');

要将一个流重新定位到特定子流,请设置其 Substream 属性。例如,在循环中生成随机数。在循环的每次迭代之前,将随机数流定位到一个不同子流的开头。生成 3 组相互独立的 5 个随机数。

for i = 1:3 s.Substream = i; z = rand(s,1,5) endz = 1×5 0.7270 0.4522 0.9387 0.2360 0.0277 z = 1×5 0.5582 0.8527 0.7733 0.0633 0.2788 z = 1×5 0.1666 0.2924 0.7728 0.8391 0.5107

要重现第二组的 5 个随机数,请将流重新定位到对应的子流。

s.Substream = 2; z = rand(s,1,5)z = 1×5 0.5582 0.8527 0.7733 0.0633 0.2788 详细信息

全部展开

随机数流

随机数流是由确定性算法生成的一个伪随机数序列的源。伪随机序列是随机数理论序列的逼近,其分布满足独立同分布 (i.i.d.) 条件,但实际上,确定性算法无法生成 i.i.d 序列。算法生成的序列可通过分布和相关性的统计检验,表明它们是很好的逼近。

扩展功能基于线程的环境 使用 MATLAB® backgroundPool 在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool 加快代码运行速度。

此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。

版本历史记录

在 R2008b 中推出

另请参阅

rng | rand | randi | randn | randperm

主题创建随机数数组创建和控制随机数流控制随机数的生成使用 RandStream 管理全局流多个流


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3